package com.such.kit.easyparam;

import java.util.HashMap;
import java.util.Map;
import com.such.kit.validate.ValidateCommons;

/**
 * @author SUCH
 * <pre>
 * 用于快速构建参数 map
 * </pre>
 */
public class ParamMap<K, V> extends HashMap<K, V> {

	private static final long serialVersionUID = -5044213732365718212L;

	/**
	 * <pre>
	 * 添加参数
	 * </pre>
	 * @param key 键
	 * @param value 值
	 * @return 当前 ParamMap
	 */
	public ParamMap<K, V> putParam(K key, V value) {
		this.put(key, value);
		return this;
	}

	/**
	 * <pre>
	 * 添加参数
	 * </pre>
	 * @param keyValues 键值对集
	 * @return 当前 ParamMap
	 */
	public ParamMap<K, V> putAllParam(Map<? extends K, ? extends V> keyValues) {
		if (ValidateCommons.isNotEmpty(keyValues)) {
			this.putAll(keyValues);
		}
		return this;
	}

	/**
	 * <pre>
	 * 从 data 中获取指定值
	 * 当指定值为空，则取默认值
	 * </pre>
	 * @param key 键
	 * @param data 数据
	 * @param defaultValue 默认值
	 * @return 值
	 */
	public static <K, V> V getValue(K key, Map<K, V> data, V defaultValue) {
		V value = null;
		if (ValidateCommons.isNotEmpty(data)) {
			value = data.get(key);
			if (ValidateCommons.isEmpty(value)) {
				value = defaultValue;
			}
		} else {
			value = defaultValue;
		}
		return value;
	}

	/**
	 * <pre>
	 * 从 data 中获取指定值
	 * </pre>
	 * @param key 键
	 * @param data 数据
	 * @return 值
	 */
	public static <K, V> V getValue(K key, Map<K, V> data) {
		V value = null;
		if (ValidateCommons.isNotEmpty(data)) {
			value = data.get(key);
		}
		return value;
	}

	/**
	 * <pre>
	 * 从 data 中获取指定值
	 * 当指定值为空，则取默认值
	 * </pre>
	 * @param key 键
	 * @param data 数据
	 * @param defaultValue 默认值
	 * @return 值
	 */
	public static <T> T getValue(String key, Map<String, Object> data, Object defaultValue) {
		Object value = null;
		if (ValidateCommons.isNotEmpty(data)) {
			value = data.get(key);
			if (ValidateCommons.isEmpty(value)) {
				value = defaultValue;
			}
		} else {
			value = defaultValue;
		}
		return (T) value;
	}

	/**
	 * <pre>
	 * 从 data 中获取指定值
	 * </pre>
	 * @param key 键
	 * @param data 数据
	 * @return 值
	 */
	public static <T> T getValue(String key, Map<String, Object> data) {
		Object value = null;
		if (ValidateCommons.isNotEmpty(data)) {
			value = data.get(key);
		}
		return (T) value;
	}

}
